class MayBe {
  static of(value) {
    return new MayBe(value)
  }

  constructor(value) {
    this._value = value
  }

  map(fn) {
    return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value));
  }

  isNothing() {
    return this._value === null || this._value === undefined;
  }
}

const r1 = MayBe.of('hello word').map(x => x.toUpperCase());
const r2 = MayBe.of(null).map(x => x.toUpperCase());

console.log(r1)
console.log(r2)